home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / The World of Computer Software.iso / srcuc.zip / PTRVEC.C < prev    next >
C/C++ Source or Header  |  1990-06-20  |  4KB  |  144 lines

  1. /* Copyright (C) 1990 Free Software Foundation, Inc.
  2.  
  3.    This program is free software; you can redistribute it and/or modify
  4.    it under the terms of the GNU General Public License as published by
  5.    the Free Software Foundation; either version 1, or (at your option)
  6.    any later version.
  7.  
  8.    This program is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.    GNU General Public License for more details.
  12.  
  13.    You should have received a copy of the GNU General Public License
  14.    along with this program; if not, write to the Free Software
  15.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  16.  
  17. /* $Header: ptrvec.c,v 1.1 90/06/20 19:38:50 GMT cph Exp $ */
  18.  
  19. #include <stdio.h>
  20. #include "dstack.h"
  21.  
  22. static PTR
  23. DEFUN (xmalloc, (length), unsigned int length)
  24. {
  25.   extern PTR EXFUN (malloc, (unsigned int length));
  26.   PTR result = (malloc (length));
  27.   if (result == 0)
  28.     {
  29.       fputs ("malloc: memory allocation failed\n", stderr);
  30.       fflush (stderr);
  31.       abort ();
  32.     }
  33.   return (result);
  34. }
  35.  
  36. static PTR
  37. DEFUN (xrealloc, (ptr, length), PTR ptr AND unsigned int length)
  38. {
  39.   extern PTR EXFUN (realloc, (PTR ptr, unsigned int length));
  40.   PTR result = (realloc (ptr, length));
  41.   if (result == 0)
  42.     {
  43.       fputs ("realloc: memory allocation failed\n", stderr);
  44.       fflush (stderr);
  45.       abort ();
  46.     }
  47.   return (result);
  48. }
  49.  
  50. Tptrvec
  51. DEFUN (ptrvec_allocate, (length), Tptrvec_length length)
  52. {
  53.   Tptrvec ptrvec = (xmalloc (sizeof (struct struct_ptrvec)));
  54.   (ptrvec -> length) = length;
  55.   (ptrvec -> elements) =
  56.     ((length > 0) ? (xmalloc (length * (sizeof (PTR)))) : 0);
  57.   return (ptrvec);
  58. }
  59.  
  60. void
  61. DEFUN (ptrvec_deallocate, (ptrvec), Tptrvec ptrvec)
  62. {
  63.   if ((ptrvec -> length) > 0)
  64.     free (ptrvec -> elements);
  65.   free (ptrvec);
  66. }
  67.  
  68. void
  69. DEFUN (ptrvec_set_length, (ptrvec, length),
  70.        Tptrvec ptrvec AND
  71.        Tptrvec_length length)
  72. {
  73.   (ptrvec -> length) = length;
  74.   (ptrvec -> elements) =
  75.     ((length > 0)
  76.      ? (xrealloc ((ptrvec -> elements), (length * (sizeof (PTR)))))
  77.      : 0);
  78. }
  79.  
  80. Tptrvec
  81. DEFUN (ptrvec_copy, (ptrvec), Tptrvec ptrvec)
  82. {
  83.   Tptrvec_length length = (PTRVEC_LENGTH (ptrvec));
  84.   Tptrvec result = (ptrvec_allocate (length));
  85.   PTR * scan_source = (PTRVEC_START (ptrvec));
  86.   PTR * end_source = (scan_source + length);
  87.   PTR * scan_result = (PTRVEC_START (result));
  88.   while (scan_source < end_source)
  89.     (*scan_result++) = (*scan_source++);
  90.   return (result);
  91. }
  92.  
  93. void
  94. DEFUN (ptrvec_adjoin, (ptrvec, element), Tptrvec ptrvec AND PTR element)
  95. {
  96.   Tptrvec_length length = (PTRVEC_LENGTH (ptrvec));
  97.   ptrvec_set_length (ptrvec, (length + 1));
  98.   (PTRVEC_REF (ptrvec, length)) = element;
  99. }
  100.  
  101. int
  102. DEFUN (ptrvec_memq, (ptrvec, element), Tptrvec ptrvec AND PTR element)
  103. {
  104.   PTR * scan = (PTRVEC_START (ptrvec));
  105.   PTR * end = (scan + (PTRVEC_LENGTH (ptrvec)));
  106.   while (scan < end)
  107.     if (element == (*scan++))
  108.       return (1);
  109.   return (0);
  110. }
  111.  
  112. void
  113. DEFUN (ptrvec_move_left,
  114.        (source, source_start, source_end, target, target_start),
  115.        Tptrvec source AND
  116.        Tptrvec_index source_start AND
  117.        Tptrvec_index source_end AND
  118.        Tptrvec target AND
  119.        Tptrvec_index target_start)
  120. {
  121.   PTR * scan_source = (PTRVEC_LOC (source, source_start));
  122.   PTR * end_source = (PTRVEC_LOC (source, source_end));
  123.   PTR * scan_target = (PTRVEC_LOC (target, target_start));
  124.   while (scan_source < end_source)
  125.     (*scan_target++) = (*scan_source++);
  126. }
  127.  
  128. void
  129. DEFUN (ptrvec_move_right,
  130.        (source, source_start, source_end, target, target_start),
  131.        Tptrvec source AND
  132.        Tptrvec_index source_start AND
  133.        Tptrvec_index source_end AND
  134.        Tptrvec target AND
  135.        Tptrvec_index target_start)
  136. {
  137.   PTR * end_source = (PTRVEC_LOC (source, source_start));
  138.   PTR * scan_source = (PTRVEC_LOC (source, source_end));
  139.   PTR * scan_target =
  140.     (PTRVEC_LOC (target, (target_start + (source_end - source_start))));
  141.   while (scan_source > end_source)
  142.     (*--scan_target) = (*--scan_source);
  143. }
  144.